perm filename XGPTST.FAI[XGP,BGB] blob sn#041586 filedate 1973-05-11 generic text, type T, neo UTF8
COMMENT ⊗   VALID 00002 PAGES 
RECORD PAGE   DESCRIPTION
 00001 00001
 00002 00002		TITLE	BUFFER  DOROTHY BENDER ****** GARPLY *******
 00009 ENDMK
⊗;
	TITLE	BUFFER;  DOROTHY BENDER ****** GARPLY *******

;  ROUTINE TO READ THE OUTPUT FROM THE MUSIC
;  PROGRAM AND CALL THE D-A CONVERTER TO PLAY.
;  
;  THE NAME OF THE FILE TO BE INPUTTED IS 'MUSIC',
;  THE FIRST RECORD OF WHICH CONTAINS THE
;  NUMBER OF WORDS OF DATA IN THE ENTIRE DISK FILE.

A   ←   1     ;WORK
B   ←   2     ;WORK
RET ←   3     ;RETURN ACCUMULATOR
BUFSIZ ←=20224   
↓DSKCHN ←1             ;DISK CHANNEL FOR INPUT
↓ADCHN  ←2             ;D-A CHANNEL FOR OUTPUT

	OPDEF	READCH [51B8]
        OPDEF   MESSAGE[51B8!3B12]

BEG:	CALLI	0,0         ;RESET I/O DEVICES
 	OPEN 	DSKCHN,[17  ;MODE
		'DSK   '    ;DEVICE NAME
 		0]          ;NO BUFFER HEADERS
	HALT	BEG         ;RESTART IF DEVICE IS UNAVAILABLE

 	SETZM	FILBLK+3    ;FOR RESTART
 	SETZM	FILBL2+3    ;FOR RESTART
LX:;	MESSAGE [ASCIZ/
;  TYPE `P' TO PLAY FROM DISK, `C' TO COPY TAPE TO DISK.
;/]
;	readch a
;	cain a,"C"
;	jrst start
;	caie a,"P"
;	jrst lx
	skipe filblk+3	;is this first time through ?
	jrst pla2	;No. Parameters already set up.
	;FIND OUT NUMBER OF CHANNELS AND
	;THE SPEED.

;	MESSAGE	[ASCIZ/HOW MANY CHANNELS?/]
;	READCH	A
;	SUBI	A,"0"+1		;CONVERT TO BINR AND ADD 1
;	DPB	A,[POINT 2,OUTBIT,26]
;
;	MESSAGE [ASCIZ/WHAT IS THE SPEED?/]
;	READCH  A
;	SUBI	A,"0"
;	DPB	A,[POINT 3,OUTBIT,32]

PLA2:	SETZM FILBLK+3
	SETZM FILBL2+3
	LOOKUP	DSKCHN,FILBLK
	SKIPA			;CAN'T FIND MUSIC.MUS
	JRST XOPEN		;FOUND IT
	LOOKUP  DSKCHN,FILBL2	;TRY FOR MUSAA.DMD

	JRST	[MESSAGE[ASCIZ/
		*** MUSIC FILE NOT FOUND/]
		CALLI  12]
        ;EXIT IF FILE IS MISSING
	MOVE A,FILBL2+3	;GET LENGTH OF MUSAA.DMD
	MOVEM A,FILBLK+3;PUT IT IN RIGHT PLACE

XOPEN:	OPEN	ADCHN,[117 	;MODE
;        	'AD    '        ;DEVICE NAME
        	'XGP   '        ;DEVICE NAME
 		0]              ;NO BUFFER HEADERS

  	JRST	[MESSAGE[ASCIZ/
		***XGP NOT AVAILABLE/]
		CALLI  12]
	;EXIT IF D-A IS UNAVAILABLE

SPWAR:	SPCWAR 17,[CALLI]
	MESSAGE [ASCIZ/ GO? /]
	READCH A


LNTH:	movs a,filblk+3		;get length of file.
	movnm a,nwd

;	-----------------------------------------

	;BEGIN MAIN BODY OF PROGRAM

LOOP:	JSP	RET,SUB		;ROUTINE TO READ AND WRITE
	BUF1-1 			;USE BUF1 FOR THE I/O
	JUMPLE	B,OUT    	;DONE
	
	JSP	RET,SUB		;CALL IT AGAIN
	BUF2-1			;USE BUF2 FOR THE I/O
	JUMPG	B,LOOP		;GO BACK FOR MORE IF B>0

OUT:	close dskchn,		;END OF PROGRAM.
	releas adchn,
	SPCWAR 0,'SSW'
	jrst lx

	;SUBROUTINE TO SET UP IOWD AND READ AND WRITE.
	;  1(RET) WILL BE THE RETURN
	;  0(RET) WILL BE THE ADDRESS OF THE BUFFER TO BE
	;         PUT IN THE RIGHT HALF OF THE IOWD.
	;  A      WILL BE A WORK REGISTER
    	;  B      WILL BE TESTED ON THE OUTSIDE.

SUB:	MOVNI	A,BUFSIZ	;PICK UP AND COMPLEMENT BUFSIZ
	ADDB	A,NWD		;A←NWD-BUFSIZ
				;NWD←NWD-BUFSIZ
	MOVE	B,A		;SAVE B TO BE TESTED FOR LAST
				;TIME.
	JUMPL	A,LAST		;SET UP FOR LAST TIME.
	MOVEI	A,0		

	;THE IOWD LOOKS LIKE:
	;  [-BUFSIZ / BUFI-1]

LAST:	ADDI	A,BUFSIZ
	MOVNS	A		;COMPLEMENT A
	HRL	A,0(RET)	;PICK UP BUFI AND MOVE IT
				;TO THE LEFT SIDE OF A.
	MOVSM	A,INLIST	;SWAP A AND MOVE IT.
	MOVSM	A,OUTWC		;SAME FOR OUTPUT.
	INPUT	DSKCHN,INLIST	;READ A RECORD.
	OUTPUT	ADCHN,OUTWC	;WRITE THE RECORD.
	JRST	1(RET)		;RETURN

;	-----------------------------------------

; STORAGE:

NWD:	0			;FOR NUMBER OF WORDS OF INPUT.
↓BUF1:	BLOCK	BUFSIZ+1	;BUFFER 1
BUF2:	BLOCK	BUFSIZ+1	;BUFFER 2

FILBLK: 'MUSIC '		;FILENAME FOR INPUT
	'MUS   '			;EXTENSION
	0			;INFORMATION ON FILE
	0			;PROJECT PROG#

FILBL2: 'MUSAA '		;FILENAME FOR INPUT, 2ND CHOICE
	'DMD   '			;EXTENSION
	0			;INFORMATION ON FILE
	0			;PROJECT PROG#

CLIST:	IOWD	1,NWD		;FOR THE FIRST RECORD
	0

INLIST:	0			;WILL CONTAIN AN IOWD
	0

OUTWC:	0			;WILL CONTAIN AN IOWD FOR D-A
	0
;	3650			;MAGIC BITS FOR 136.
OUTBIT: 4000			;BITS FOR D-A
	BLOCK	2

begin magdsk

A←1
B←2
D←3
OLNG←=2432	;size of mag tape records. must be multiple of =128.

ILNG←=2432
ichn←adchn
ochn←dskchn
↑START:	CALLI 0
	INIT ICHN,3B28+17
	SIXBIT /MTA0/
	0
	HALT
	MTAPE ICHN,1	;REWIND THE TAPE
	JFCL
	INIT OCHN,17
	SIXBIT /DSK/
	0
	HALT
	ENTER OCHN,[SIXBIT /MUSIC/
                    SIXBIT /MUS/
	            0
	            0]
	HALT
	loop:input ichn,olst
		statz ichn,20000
		jrst out	;end of tape.
		output ochn,olst
		jrst loop
OLST:	IOWD OLNG,OBUF
	0
obuf←← buf1
	bend magdsk

end beg